#include <stdio.h>
#include <hal_uart.h>
#include "gizwits_protocol.h"

bit		B_TI;
bit		B_TI2;

#define RX1_Lenth 3
uint8_t RX1_Buffer[RX1_Lenth];	//接收缓冲
uint8_t	TX1_Cnt;	//发送计数
uint8_t	RX1_Cnt;	//接收计数

/****************串口1发送函数*********************
void	UART1_TxByte(unsigned char dat)
{
	B_TI = 0;		//发送标志
	SBUF = dat;		//SBUF在这里是一个可写发送缓冲寄存器，把需要发送的数据放在寄存器中
	while(!B_TI);	//等待数据传送，传送结束后B_TI置1	
	B_TI = 0;		//发送标志
}
*/
/****************串口2发送函数**********************/

void	UART2_TxByte(unsigned char dat)
{
	B_TI2 = 0;	//发送标志
	S2BUF = dat;	//SBUF在这里是一个可写发送缓冲寄存器，把需要发送的数据放在寄存器中
	while(!B_TI2);	//等待数据传送，传送结束后B_TI2置1
	B_TI2 = 0;	//发送标志
}
/*
void PrintString1(unsigned char code *puts)		//发送一串字符串
{
    for (; *puts != 0;	puts++)  UART1_TxByte(*puts); 	//遇到停止符0结束
}

void PrintString2(unsigned char code *puts)		//发送一串字符串
{
    for (; *puts != 0;	puts++)  UART2_TxByte(*puts); 	//遇到停止符0结束
}
*/
/****************串口1初始化函数*********************

void	uart1_init(void)
{
						//9600bps@11.0592MHz
	PCON &= 0x7f;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xfe;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0f;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = (256 - (FOSC/32/BAUD1));		//设定定时初值
	TH1 = (256 - (FOSC/32/BAUD1));		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES  = 1;			//串行口中断允许（ES=1允许，ES=0禁止）		
	EA = 1;				//中断总开关
}

*/

/****************串口1中断函数*********************
void UART1_RCV (void) interrupt 4	//串口1我们没有用到接收，这里可以删除。
{
	//@zhengyimin
	uint8_t gizbuf;
	if(RI)	//等待串口2接收完成
	{
		RI = 0;	//接收中断请求标志位清0	
		gizbuf = SBUF;	//SBUF在这里是一个接收缓冲寄存器，把接收到数据放到我们的自定义的接收缓冲区
		gizPutData(&gizbuf,1);//把接收到的数据放到环形缓冲区
	}
	
	//@zhengyimin
	if(TI)	//等待发送完成
	{
		TI = 0;		//发送中断标志位,必须通过软件清零
		B_TI = 1;	//数据发送完成的标志
	}
}
*/

/****************串口2初始化***********************/
void	uart2_init(void)	//115200bps@11.0592MHz
{
	//SCON = 0x50;		//8位数据,可变波特率
	S2CON &= ~(1<<7);	//8位数据
	P_SW2 &= ~1;		//UART2 使用P1.0 P1.1口默认
	
	AUXR &= ~(1<<4);	//Timer stop
	AUXR &= ~(1<<3);	//Timer2 set As Timer
	AUXR |=  (1<<2);	//Timer2 set as 1T mode
	
    T2L = (65536 - (FOSC/4/BAUD2));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD2))>>8;
    //AUXR |= 0x14;                //T2为1T模式, 并启动定时器2
 
	//IE2 = 0x01;                 //使能串口2中断
	//IE2 |=  1;			//允许串口2中断
	
	IE2   |=  1;		//允许中断
	S2CON |=  (1<<4);	//允许接收
	AUXR |=  (1<<4);	//Timer run enable

	EA = 1;		//允许全局中断
}
//void  setLedDat(uint8_t led_1,uint8_t led_2,uint8_t led_3);
/**************串口2中断函数**********************/
void UART2_RCV (void) interrupt 8
{
  uint8_t gizbuf;//@zhengyimin
	
	if(TI2)		//等待串口2发送完成
	{
		CLR_TI2();	//发送中断请求标志位清0
		B_TI2 = 1;	//数据发送完成的标志
	}
	//@zhengyimin
	if(RI2)
	{
		//setLedDat(10,18,1);
		CLR_RI2();
		//if(RX1_Cnt >= RX1_Lenth)	RX1_Cnt = 0;	//避免溢出处理
		//RX1_Buffer[RX1_Cnt ++] = S2BUF;		//保存一个字节
		gizbuf = S2BUF;	//SBUF在这里是一个接收缓冲寄存器，把接收到数据放到我们的自定义的接收缓冲区
		gizPutData(&gizbuf,1);//把接收到的数据放到环形缓冲区	
	}
	//@zhengyimin
}

/*
void UART2_INT (void) interrupt 8
{
	if(RI2)
	{
		CLR_RI2();
		if(++RX1_Cnt >= RX1_Lenth)	RX1_Cnt = 0;	//避免溢出处理
		RX1_Buffer[RX1_Cnt] = SBUF;		//保存一个字节
	}

	if(TI2)
	{
		CLR_TI2();		//发送中断标志位,必须通过软件清零
		B_TI = 1;	//数据发送完成的标志
	}
}

void	UART2_TxByteTst(unsigned char dat)
{
	B_TI = 0;		//发送标志
	SBUF = dat;		//SBUF在这里是一个可写发送缓冲寄存器，把需要发送的数据放在寄存器中
	while(!B_TI);	//等待数据传送，传送结束后B_TI置1	
	B_TI = 0;		//发送标志
}

void urat1_test()
{
		while(RX1_Cnt > 0)		//收到过数据
		{
			//if(!B_TI)		//发送空闲
			//{
				RX1_Cnt --;
				UART2_TxByte(RX1_Buffer[RX1_Cnt]);
				

			//}
		}
}
*/